package edu.zjut.yzj.matchingsystem.service.impl.utils;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.web.client.RestTemplate;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.ReentrantLock;

@Component
public class MatchingPool extends Thread{

    private static List<Player> players = new ArrayList<>();

    private ReentrantLock lock = new ReentrantLock();

    private static RestTemplate restTemplate;

    private final static String startGameUrl = "http://127.0.0.1:3000/pk/start/game";

    @Autowired
    public void setRestTemplate(RestTemplate restTemplate) {
        MatchingPool.restTemplate=restTemplate;
    }

    public void addPlayer(Integer userId, Integer rating, Integer botId) {
        lock.lock();
        try {
            players.add(new Player(userId, rating, botId,0));
        }finally {
            lock.unlock();
        }

    }

    public void removePlayer(Integer userId) {
        lock.lock();
        try {
            ArrayList<Player> newPlayers = new ArrayList<>();
            for (Player player : MatchingPool.players) {
                if (!player.getUserId().equals(userId)) {
                    newPlayers.add(player);
                }
                MatchingPool.players = newPlayers;
            }
        }finally {
            lock.unlock();
        }
    }

    private void increaseWaitingTime() {//给所有玩家的等待时间+1
        for (Player player : players) {
            player.setWaitingTime(player.getWaitingTime() + 1);
        }
    }

    private void matchPlayers() {   //尝试匹配所有玩家

        System.out.println("当前匹配池中的玩家："+players.toString());
        boolean[] used=new boolean[players.size()];

        for (int i = 0; i < players.size(); i++) {
            if(used[i]) continue;
            for (int j = i + 1; j < players.size(); j++) {
                if(used[j]) continue;
                Player a = players.get(i);
                Player b = players.get(j);
                if (checkMatched(a, b)) {
                    used[i] = used[j] = true;
                    sendMatchResult(a, b);
                    break;
                }
            }
        }

        ArrayList<Player> newPlayers = new ArrayList<>();
        for (int i = 0; i < players.size(); i++) {
            if (!used[i]) {
                newPlayers.add(players.get(i));
            }
        }

        players = newPlayers;
    }

    private boolean checkMatched(Player a, Player b) {  //判断两名玩家是否匹配
        int ratingDelta = Math.abs(a.getRating() - b.getRating());
        int waitingTime = Math.min(a.getWaitingTime(), b.getWaitingTime());

        //分差要小于等于 两名玩家目前能接受的分差的较小者
        return ratingDelta <= waitingTime * 10;
    }

    private void sendMatchResult(Player a, Player b) {  //返回匹配成功的结果
        System.out.println("匹配成功，匹配的两名玩家是："+a+"和"+b);
        LinkedMultiValueMap<String, String> data = new LinkedMultiValueMap<>();
        data.add("a_id", a.getUserId().toString());
        data.add("a_bot_id",a.getBotId().toString());
        data.add("b_id", b.getUserId().toString());
        data.add("b_bot_id",b.getBotId().toString());
        restTemplate.postForObject(startGameUrl, data, String.class);
    }

    @Override
    public void run() {
        while (true) {
            try {
                Thread.sleep(1000);
                lock.lock();
                try {
                    increaseWaitingTime();
                    matchPlayers();
                }finally {
                    lock.unlock();
                }


            } catch (InterruptedException e) {
                e.printStackTrace();
                break;
            }
        }
    }
}
